// 依赖是谁，当属性发生变化时通知谁
// 用到的数据的地方很多，集中处理 用到数据的地方的类 Watcher， 收集依赖阶段也就是收集 Watcher的实例，
// 数据发生变化的时候通知 Watcher , 它在通知使用的地方

const  bailER=/[^\w.$]/
function parsePath(path){
  if(bailER.test(path)){
    return 
  }
  const segment=path.split('.')
  return function(obj){
    for(let i=0;i<segment.legth;i++){
      if(!obj){
        return
      }
      obj=obj[segment[i]]
    }
    return obj
  }
}


class Watcher {
  constructor(vm,expOrFn,cb){
    this.vm=vm
    this.getter=parsePath(expOrFn)
    this.cb=cb
    this.value=this.get()
  }
  get(){
    // 赋值 Wacther 实例
    window.target=this;
    // 
    let value=this.getter().call(this.vm,this.vm)
    window.target=undefined
    return value
  }

  update(){
    const oldValue=this.value;
    this.value=this.get()
    this.cb.call(this.vm,this.value,oldValue)
  }
}

